/*
 * Editor: Rodrigo Silva
 */
package br.com.bigaccoxx.datas;

import br.com.bigaccoxx.excecoes.BigAccoxxException;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 
 * Classe para manipulação de datas v8.8.11
 */
public class Data {

    private static GregorianCalendar calendario1 = new GregorianCalendar();
    private static GregorianCalendar calendario2 = (GregorianCalendar) calendario1.clone();

    /**
     * Comparação de datas ignorando hora
     * @param Date
     * @param String (formatos "31/12/2000" ou "31122000")
     * @return -1 quando primeiro argumento MAIOR que segundo argumento,
     * 1 quando primeiro argumento MENOR que segundo argumento,
     * 0 para argumentos iguais
     * 
     */
    public static int compararDatas(Date data1, Date data2) {
        calendario1.setTime(data1);
        calendario2.setTime(data2);
        return fazerComparacao();
    }

    /**
     * Comparação de datas ignorando hora
     * @param Date
     * @param String (formatos "31/12/2000" ou "31122000")
     * @return -1 quando primeiro argumento MAIOR que segundo argumento,
     * 1 quando primeiro argumento MENOR que segundo argumento,
     * 0 para argumentos iguais
     * 
     */
    public static int compararDatas(String data1, String data2) 
            throws BigAccoxxException {
        try {
            String data1Temp = data1;
            String data2Temp = data2;

            if (data1.length() < 10) {
                StringBuffer sb = new StringBuffer(data1);
                sb.insert(2, "/");
                sb.insert(5, "/");
                data1Temp = sb.toString();
            }

            if (data2.length() < 10) {
                StringBuffer sb = new StringBuffer(data2);
                sb.insert(2, "/");
                sb.insert(5, "/");
                data2Temp = sb.toString();
            }

            DateFormat df = DateFormat.getDateInstance();
            calendario1.setTime(df.parse(data1Temp));
            calendario2.setTime(df.parse(data2Temp));
            return fazerComparacao();

        } catch (ParseException ex) {
            throw new BigAccoxxException("Erro: " + ex.getMessage(), ex);
        }
    }

    /**
     * Comparação de datas ignorando hora
     * @param Date
     * @param String (formatos "31/12/2000" ou "31122000")
     * @return -1 quando primeiro argumento MAIOR que segundo argumento,
     * 1 quando primeiro argumento MENOR que segundo argumento,
     * 0 para argumentos iguais
     * 
     */
    public static int compararDatas(String data1, Date data2){

        String data1Temp = data1;

        if (data1.length() < 10) {
            StringBuffer sb = new StringBuffer(data1);
            sb.insert(2, "/");
            sb.insert(5, "/");
            data1Temp = sb.toString();
        }

        int data1Dia = Integer.parseInt(data1Temp.substring(0, 2));
        int data1Mes = Integer.parseInt(data1Temp.substring(3, 5));
        int data1Ano = Integer.parseInt(data1Temp.substring(6));

        //------------------------------------------------------

        int data2Dia = data2.getDate();
        int data2Mes = (data2.getMonth() + 1);
        int data2Ano = data2.getYear() + 1900;

        //------------------------------------------------------
        calendario1.set(data1Ano, data1Mes, data1Dia);
        calendario2.set(data2Ano, data2Mes, data2Dia);
        //------------------------------------------------------
        return fazerComparacao();
    }

    /**
     * Comparação de datas ignorando hora
     * @param Date
     * @param String (formatos "31/12/2000" ou "31122000")
     * @return -1 quando primeiro argumento MAIOR que segundo argumento,
     * 1 quando primeiro argumento MENOR que segundo argumento,
     * 0 para argumentos iguais
     * 
     */
    public static int compararDatas(Date data1, String data2){

        int data1Dia = data1.getDate();
        int data1Mes = (data1.getMonth() + 1);
        int data1Ano = data1.getYear() + 1900;

        //------------------------------------------------------
        String data2Temp = data2;

        if (data2.length() < 10) {
            StringBuffer sb = new StringBuffer(data2);
            sb.insert(2, "/");
            sb.insert(5, "/");
            data2Temp = sb.toString();
        }

        int data2Dia = Integer.parseInt(data2Temp.substring(0, 2));
        int data2Mes = Integer.parseInt(data2Temp.substring(3, 5));
        int data2Ano = Integer.parseInt(data2Temp.substring(6));

        //------------------------------------------------------
        calendario1.set(data1Ano, data1Mes, data1Dia);
        calendario2.set(data2Ano, data2Mes, data2Dia);
        //------------------------------------------------------
        return fazerComparacao();
    }

    private static int fazerComparacao() {
        if (calendario1.before(calendario2)) {
            return 1;
        } else if (calendario1.after(calendario2)) {
            return -1;
        }
        return 0;
    }

    /** 
     * @param data
     * @param ano + para adicionar ou - para subtrair tempo
     * 
     */
    public static Date modificarAno(Date data, int ano) {
        calendario1.setTime(data);
        calendario1.add(Calendar.YEAR, ano);
        return new Date(calendario1.getTimeInMillis());
    }

    /** 
     * @param data
     * @param mes  + para adicionar ou - para subtrair tempo
     * 
     */
    public static Date modificarMes(Date data, int mes) {
        calendario1.setTime(data);
        calendario1.add(Calendar.MONTH, mes);
        return new Date(calendario1.getTimeInMillis());
    }

    /** 
     * @param data
     * @param dia + para adicionar ou - para subtrair tempo
     * 
     */
    public static Date modificarDia(Date data, int dia) {
        calendario1.setTime(data);
        calendario1.add(Calendar.DAY_OF_MONTH, dia);
        return new Date(calendario1.getTimeInMillis());
    }
}
